.TH DHCP.CONF 5
.SH NAME
dhcp.conf \- dynamic host configuration protocol configuration
.SH SYNOPSIS
.B /etc/dhcp.conf
.SH DESCRIPTION
.de SP
.if t .sp 0.4
.if n .sp
..
The file
.B /etc/dhcp.conf
contains the configuration for the DHCP client/server program
.BR dhcpd .
This text is a long summation of all the elements that can be found in this
configuration file.  For a more "just tell me what to do" approach see
.BR boot (8).
.PP
The syntax used is that of the common configuration file described in
.BR configfile (5).
.PP
To find information for a client we first need its IP address.  Occasionally
this IP address is already known (the special "INFORM" query), but normally
we have to make a first pass through the configuration file for a
.B client
entry.  If that fails then we use an IP address from the pool file.  If we
now have an IP address then the real information gathering can begin.
.PP
The DHCP daemon reads the configuration file from beginning to end and
gathers all information that matches, and information from all macros that
are mentioned within the elements that match.  If we end up with DHCP
information that includes at least a netmask definition, and is good for the
network the request came in from, then it is returned to the client.  If a
DHCP tag is specified twice then the last one wins.
.PP
In the description below we use [ and ] to denote optional things, and | to
show a choice between two things.
.PP
Client IDs can be either ordinary Ethernet addresses, that are treated as a
seven octet string (01 followed by the Ethernet address), or any random
octet string in hexadecimal.
.PP
IP addresses can be simply that, or host names.  These host names are
searched in
.B /etc/hosts
by
.B dhcpd
itself using a domain based prefix match, i.e. you can use "flotsam" for
"flotsam.example.com", but not "alpha" for "alphabeta".  Once the program
decides to be a server it will also look up names normally in the DNS.
If a host has more than one IP address then the address on the network the
query was seen on is used.
.PP
Case isn't important in the configuration file, "client", "CLIENT" and
"ClIeNt" are all treated the same.
.PP
Some elements may optionally name a macro or a curly braces enclosed
parameter list of more elements.  If the element matches then the data
in the macro body or parameter list is gathered.
.PP
The following elements can be used:
.PP
.B client
.I client-ID
.RB [ ip #]
.I host
.RI [ macro |{ params }];
.PP
.RS
Defines a client with a given client ID that is to have the IP address
denoted by
.I host .
On the first pass only the client ID is matched looking for an IP address
that lies on the network the request came in on.  On the
information gathering pass both client ID and IP address must match.  If
a machine has the same Ethernet address on two or more interfaces then the
IP address given out is the one on the same network as the request came in
on.  The optional interface name
.RB ( ip #)
must be used if the DHCP daemon is gathering data for itself at boot time
to differentiate interfaces with the same ethernet addresses.  This is
only necessary under Minix-vmd when ethernets on different VLANs share
the same physical ethernet.  The interface name is only used for a machine's
own networks, it ignored on entries for other hosts.
.RE
.PP
.B class
.IR class-name " ..."
.IR macro |{ params };
.PP
.RS
Includes the macro or parameters if one of the class names is matched.  A
host normally includes a class ID in its request.  MINIX 3 and Minix-vmd
use "Minix" as the class name.  For Windows the class ID starts with
"MSFT", and Solaris' starts with "SUNW".
(Use
.B dhcpd \-d3
to find out what the full IDs are exactly.)  The class names are matched if a
.I class-name
is a prefix of the class ID sent by the client.
.RE
.PP
.B host
.I host-spec
.IR macro |{ params };
.PP
.RS
Includes the macro or parameters if the IP address of the client matches the
host specification.  This can either be an ordinary hostname, or a netblock
in CIDR notation, e.g. 172.35.0.0/16.  The example includes all IP addresses
whose top 16 bits are the same as the top 16 bits of 172.35.0.0.  Such a
netblock automatically defines a netmask (255.255.0.0 in the example) if no
netmask has been specified yet.
.RE
.PP
.B interface
.BR ip #
.I host
.RI [ macro |{ params }];
.PP
.RS
Makes
.B dhcpd
set the IP address of interface
.BR ip #
(where # is a number) to the IP address denoted by
.IR host .
This element should only be used for interfaces that are not true Ethernets,
and so do not have a unique Ethernet address that can be used for a client
element.  If the machine has at least one true Ethernet then all interface
elements should be added to the parameter list of a host or client element
for that Ethernet interface.  This binds them to that machine and allows a
single configuration file to be shared among machines.  Especially a server
should never have "free" interface elements.  The macro or parameters are
only evaluated if data is gathered for the given interface.  (Note that they
will be hidden by a client element for another interface.)
.RE
.PP
.B macro
.IR macro-name ;
.PP
.RS
Include the parameter list of the macro named
.I macro-name
defined elsewhere.  (This means that "host flotsam stuff" is just short
for "host flotsam { macro stuff; }".)
.RE
.PP
.B macro
.I macro-name
.RI { params };
.PP
.RS
Defines a macro with the given parameter list.  Whenever the macro is used
the parameter list is substituted instead.  A macro can not be defined
within another parameter list.
.RE
.PP
.B option
.RB [ ip #]
.B server
.RB [ inform ];
.br
.B option
.RB [ ip #]
.B relay
.IR host ;
.br
.B option
.RB [ ip #]
.BR possessive ;
.br
.B option
.RB [ ip #]
.B hostname
.IR name ;
.PP
.RS
Makes
.B dhcpd
set special options for the interface that it is gathering data for, or the
interface denoted by the optional
.BR ip #
argument.  The options are:
.SP
.B server
.RB [ inform ]
.RS
Be a DHCP server on the network connected to the interface.  Add the word
.B inform
if DHCPINFORM requests must be answered for hosts we don't have an address
for.
.RE
.SP
.B relay
.I host
.RS
Be a DHCP relay to the indicated host.
.RE
.SP
.B possessive
.RS
Do not disable the interface if the DHCP lease expires.  Useful if the
DHCP server of the provider is unreliable, crashing a lot and causing the
lease to expire.  (Think twice before turning this option on.  You have to
be absolutely sure that it's the DHCP server that's the culprit and not
a flaky network.  You don't want an IP address conflict to be your fault.)
.RE
.SP
.B hostname
.I name
.RS
Use the given name as our hostname in the DHCP queries.  Some sites key on
that bit of information instead of a client ID.
.RE
.RE
.PP
.B tag
.I number name type granularity
.IR max ;
.PP
.RS
Defines a DHCP tag for the given tag number and gives it a name.  The name can
be used in the configuration file to set tag values when gathering data.
The
.I type
field can be one of
.BR ascii ,
.BR boolean ,
.BR ip ,
.BR number
or
.BR octet
to specify the type of the tag as a simple string, a boolean, an IP address,
a number, or a string of octet values.
The
.I granularity
field specifies that that number of items must be given or a multiple
thereof, unless the type is a number, then it is the size of the number (1,
2 or 4).
The
.I max
field tells the maximum number of items that may be used with the tag, with
0 meaning "unlimited".
.SP
Three tags, the ones that MINIX 3 really cares about, have been predefined,
and there are also a few pseudotags predefined for the static fields in a
DHCP packet that one may want to set:
.SP
.RS
.nf
tag ? siaddr ip 1 1;
tag ? sname ascii 1 64;
tag ? file ascii 1 128;
tag 1 netmask ip 1 1;
tag 3 gateway ip 1 0;
tag 6 DNSserver ip 1 0;
.fi
.RE
.SP
The file
.B /usr/etc/dhcptags.conf
contains tag definitions for all standard DHCP tags.  It is wise to include
this file at the top of any DHCP configuration file.
.RE
.PP
.B no
.IR tag-name ;
.PP
.RS
Removes a tag with the given name from the data gathered at this point.
Useful if one host is different from all others, for instance if it doesn't
need a gateway definition, because it happens to be the gateway.
.RE
.PP
.IR "ascii-tag string" ;
.PP
.RS
Adds an ASCII tag to the gathered data.  The string can be a simple word, or
a quoted string.
.RE
.PP
.I boolean-tag
.BR false | true ;
.PP
.RS
Set a boolean tag to be false or true.  (Encoded as a octet of value 0 or 1.
Note that if you prefer to use 0 or 1 instead of false or true then you can
define a boolean tag as a size 1 number instead.)
.RE
.PP
.IR "ip-tag host" " ...;"
.PP
.RS
Sets a tag that needs one or more IP addresses.  The host names are
translated as usual.  To make it easier to specify netmasks one can use a
slash followed by a number, e.g.
.BR "netmask /27" ,
which is a handy alternative for
.BR "netmask 255.255.255.224" .
.RE
.PP
.IR "number-tag number" " ...;"
.PP
.RS
Set a number tag.
.RE
.PP
.IR "octet-tag hexdigits" ;
.PP
.RS
Set an octet string tag.
.I Hexdigits
is a series of hexadecimal digits that are two by two used to set the
octets.
.RE
.PP
.SH EXAMPLE
As an example the DHCP configuration used by the author of this document is
included.  His network at home consists of a number of PCs, an ISDN router
named rhone and a PC named saone serving as router/tunnel to/via a cable
ISP.  Both the rhone and the saone connect the home net to the network of
the Vrije Universiteit, but the rhone is only active if the cable doesn't
work.
.PP
The saone is a DHCP server, and one of the ordinary PCs is a backup DHCP
server.  Both use the same configuration file, which is added below, with
extra commentary introduced by
.B ##
at a deeper indent level:
.RS
.de xS	\" Example start
.sp
.nf
.ft C
..
.de xE	\" Example end
.fi
.ft R
..
.de cS	\" Commentary start
.sp
.in +12m
.ti -\w'## 'u
##\ \c
..
.de cE	\" Commentary end
.in -12m
..
.xS
.ta +8m +16m
include /usr/etc/dhcptags.conf;
.xE
.cS
With the help of the tag definitions we can use tags like "DHCPlease".
.cE
.xS
host 130.37.102.64/27 {
	DNSserver saone darask;
	host 130.37.102.88/29 { DHCPlease 259200; }
};
.xE
.cS
This defines the network 130.37.102.64/27, with netmask 255.255.255.224
(implicit from the network definition).  The DNS servers for this net are
saone and darask.  A smaller subrange of addresses is used as an address
pool on the saone, so a lease of 259200 seconds (3 days) is defined.  The
netmask is still /27, as set by the outer network definition.
.cE
.xS
host 130.37.102.248/30 {};
.xE
.cS
A network of two addresses for routing tests.
.cE
.xS
host saone {
	option server;
	option ip1 possessive;
	interface ip2 saone-net2;
	DNSserver 130.37.24.3 130.37.24.6;
};
.xE
.cS
With the network definitions done we turn our attention to the hosts.  Saone
is a DHCP server on its main interface.  The second interface
.RB ( ip1 )
is connected to the cable modem.  It gets its address from the cableco's
DHCP server, and if that server decides to go deaf then the saone keeps
the interface up ("possessive") even if the lease expires.  The pseudo IP
interface
.B ip2
is set to the IP address of
.BR saone-net2 ,
one side of the encrypted tunnel over the cable to a Minix-vmd box at the VU.
The DNS servers specified override the default setting for the network, naming
two external servers at the VU that know the world.
.cE
.xS
host darask {
	option server;
	DNSserver saone;
	class MINIX 3 { DNSserver saone 130.37.24.3 130.37.24.6; };
};
.xE
.cS
The darask is also a server, the backup for saone on the odd chance that it
is unavailable.  It uses saone and the external name servers, but only
when it is running MINIX 3.  When running Windows it only uses saone.
.cE
.xS
.ta +32m +16m
client 0:1:1b:a:68:ce	darask;	# NE2000
client 0:1:1b:a:77:23	burask;	# NE2000
#lient 0:0:c0:b0:da:64	burask;	# WD8013EWC
client 8:0:5a:38:b2:f	finiah;	# PCMCIA NE2000
client 0:0:c0:3a:12:10	bardelask;	# WD8003
#lient 2:60:8c:ab:8a:6d	bardelask;	# 3C503
client 0:a0:c5:20:9:6d	rhone;
client 0:1:1b:a:4c:3b	saone;	# NE2000
#lient 0:0:c0:fb:2:6a	saone-net1;	# WD8013EWC
.xE
.cS
Lastly the ethernet addresses of all the hosts are listed, so that they can
be translated to IP addresses.  The lines that are commented out are for
extra network cards that are currently unused.  The last is used to connect
to the cable modem, so it's only here because it's nice to have the ethernet
address written down somewhere.
.cE
.RE
.PP
The host names shown above are translated by DHCP using this
.BR /etc/hosts :
.RS
.xS
.ta +\w'130.37.102.249mm'u
604800	%ttl
2419200	%stale

130.37.102.65	darask.kjb.upwind.org
130.37.102.66	burask.kjb.upwind.org
130.37.102.67	finiah.kjb.upwind.org
130.37.102.68	bardelask.kjb.upwind.org
130.37.102.69	roniah.kjb.upwind.org

130.37.102.70	saone.kjb.upwind.org
130.37.102.2	saone-net2.kjb.upwind.org

130.37.102.88	rhone.kjb.upwind.org
130.37.102.89	dyn89.kjb.upwind.org
130.37.102.90	dyn90.kjb.upwind.org
130.37.102.91	dyn91.kjb.upwind.org
130.37.102.92	dyn92.kjb.upwind.org
130.37.102.93	dyn93.kjb.upwind.org
130.37.102.94	dyn94.kjb.upwind.org

130.37.102.249	tst1.kjb.upwind.org
130.37.102.250	tst2.kjb.upwind.org
.xE
.RE
.SH FILES
.TP
.B /usr/etc/dhcptags.conf
A supplied list of standard tag definitions as per RFC-1533.  (Well, the
tag numbers and their meaning are standard, the names are made up.)
.SH "SEE ALSO"
.BR RFC-2131 ,
.BR RFC-1533 ,
.BR configfile (5),
.BR hosts (5),
.BR boot (8),
.BR dhcpd (8).
.SH NOTES
The amount of memory
.B dhcpd
needs increases with the size of configuration file.  MINIX 3 can
handle
.B dhcptags.conf
and a modest sized
.BR dhcp.conf .
You have to increase the stack size to accommodate more.  (No problem under
Minix-vmd, of course.)
.SH NOTES
Items that are only necessary for a certain host should only be specified
for that host.  Items for a whole network are best added to a netblock
specification.  Use class elements for a certain type of host, and macros
for exceptions.  Try to limit information as much as possibly to those hosts
that need it.  (Don't go overboard.  A MINIX 3 machine won't be bothered by a
few NetBIOS tags.)
.PP
DHCPINFORM requests should always be answered when being a server, but
J. Random Sysadmin trying to diagnose problems doesn't like it when little
MINIX 3 machines show up in a packet trace unexpectedly.  It's best to be
inconspicuous on a network you don't own.
.SH BUGS
There are a few too many subtle mistakes one can make.
.SH AUTHOR
Kees J. Bot <kjb@cs.vu.nl>
